package ar.com.ctrln.view.dashboard.mantenimiento.factibilidad;

import java.util.Date;
import java.util.List;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.mantenimiento.factibilidad.ConsultarFactibilidadCliente;
import ar.com.ctrln.persistence.model.factibilidad.DetalleFactibilidad;
import ar.com.ctrln.persistence.model.factibilidad.Factibilidad;
import ar.com.ctrln.persistence.model.factibilidad.FactibilidadCliente;
import ar.com.ctrln.persistence.model.factibilidad.Requerimiento;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class MostrarFactibilidadController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = -1983474765239926716L;

	@WireVariable
	private ConsultarFactibilidadCliente consultarFactibilidadCliente;

	@Wire
	private Window wDetalleFactibilidad;

	@Wire
	private Label lNroFactibilidad;

	@Wire
	private Label lRazonSocial;

	@Wire
	private Label lTelefono;

	@Wire
	private Label lLocalidad;

	@Wire
	private Textbox tbObservaciones;

	@Wire
	private Listbox lbServicios;

	@Wire
	private Image iAgregarDetalle;

	@Wire
	private Button btnGuardarFactibilidad;

	private ListModelList<DetalleFactibilidad> modelo;

	private FactibilidadCliente factibilidad;

	@SuppressWarnings("rawtypes")
	private EventQueue agregarRequerimientos;

	@SuppressWarnings("unchecked")
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		agregarRequerimientos = EventQueues.lookup("guardarRequerimientos",
				EventQueues.DESKTOP, true);
		agregarRequerimientos.subscribe(new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {

			}
		});

		factibilidad = (FactibilidadCliente) this.getSelf().getParent()
				.getAttribute("factibilidad");
		factibilidad.setDetalles(consultarFactibilidadCliente
				.listarDetalles(factibilidad.getId()));

		wDetalleFactibilidad.setTitle("Factibilidad de: "
				+ factibilidad.getRazonSocial());

		modelo = new ListModelList<DetalleFactibilidad>();

		modelo.addAll(factibilidad.getDetalles());

		lbServicios.setModel(modelo);

		lNroFactibilidad.setValue(Long.toString(factibilidad.getId()));
		lRazonSocial.setValue(factibilidad.getRazonSocial());
		lTelefono.setValue(factibilidad.getTelefonos().iterator().next()
				.getNumero());
		lLocalidad.setValue(factibilidad.getDireccion().getLocalidad()
				.getNombre());
		tbObservaciones.setText(factibilidad.getObservaciones());
	}

	@Listen("onClick = #iAgregarDetalle")
	public void agregarDetalle() {
		if (lbServicios.getSelectedIndex() != -1) {

			DetalleFactibilidad seleccion = lbServicios.getSelectedItem()
					.getValue();

			wDetalleFactibilidad.setAttribute("detalle", seleccion);

			Executions.createComponents(
					"/zul/mantenimiento/factibilidad/agregarRequerimieto.zul",
					wDetalleFactibilidad, null);

		} else {
			Clients.showNotification("Debe Seleccionar un Servicio",
					lbServicios);
		}

	}

	@Listen("onClick = #btnGuardarFactibilidad")
	public void guardarFactibilidad() {
		double total_detalle = 0.0;
		double total_factibilidad = 0.0;

		List<DetalleFactibilidad> detalles = modelo.getInnerList();
		for (DetalleFactibilidad detalleFactibilidad : detalles) {

			if (null != detalleFactibilidad.getRequerimientos()) {
				Set<Requerimiento> requerimientos = detalleFactibilidad
						.getRequerimientos();
				for (Requerimiento requerimiento : requerimientos) {
					if (requerimiento.getId() == 0) {
						requerimiento.setDetalle(detalleFactibilidad);
						requerimiento.setMonto(requerimiento.getCantidad()
								* requerimiento.getInsumos().getPrecio());
						total_detalle += requerimiento.getMonto();
						consultarFactibilidadCliente.nuevo(requerimiento);
					} else {
						requerimiento.setMonto(requerimiento.getCantidad()
								* requerimiento.getInsumos().getPrecio());
						total_detalle += requerimiento.getMonto();
						requerimiento.setDetalle(detalleFactibilidad);
						consultarFactibilidadCliente.actualizar(requerimiento);

					}
				}
				detalleFactibilidad.setTotalDetalle(total_detalle);
				consultarFactibilidadCliente.actualizar(detalleFactibilidad);
				total_factibilidad += total_detalle;
				total_detalle = 0.0;

			}
		}
		factibilidad.setTotalFactibilidad(total_factibilidad);
		factibilidad.setEstado(Factibilidad.ESPERA_SOCIOS);
		factibilidad.setFechaModificacion(new Date());
		consultarFactibilidadCliente.actualizar(factibilidad);

		EventQueue<Event> eq = EventQueues.lookup("actualizarFactibilidad",
				EventQueues.DESKTOP, false);

		eq.publish(new Event("onButtonClick", btnGuardarFactibilidad, null));

		Clients.showNotification(
				"Factibilidad Actualizada de Solicitud de Cliente "
						+ lRazonSocial.getValue() + " exitosa ",
				Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 4000);

		wDetalleFactibilidad.onClose();
	}

}
